<?php

/**
 * Description of Nosey_Util
 *
 * @author Pablo Arciniega
 */
class Nosey_Util {

    public static function encodeParam($param) {

        return base64_encode($param);
    }

    public static function decodeParam($param) {

        return base64_decode($param);
    }

    /**
     * @author JonatanQuilca <jquilca@tradesystem.com.ec>
     * @param strign $idFieldValue : requiere el id de modelo  Field     
     * @param strign $fechaInicio : intevalo inicial del rango de fecha     
     * @param strign $fechaFin : intevalo final del rango de fecha     
     */
    public static function porcentajeRespuestas($idFieldValue, $fechaInicio = null, $fechaFin = null) {

        $command = Yii::app()->db->createCommand();
        $command->select(" nf.label, nf.field_type,  nfv.content, count(nfv.content) as 'fecuencia_fvalue'  ,na.creation_date");
        $command->from("nosey_field_value nfv");
        $command->leftJoin('nosey_field nf', 'nf.id=nfv.field_id');
        $command->leftJoin('nosey_answer na', 'na.id=nfv.answer_id');
        $command->where("nfv.field_id= :idFieldValue", array(':idFieldValue' => $idFieldValue));
        //Si hay rango de fechas
        if (!empty($fechaFin) && !empty($fechaInicio)) {

            $date_first = DateTime::createFromFormat('d/m/Y', $fechaInicio)->setTime(0, 0, 0);
            $date_last = DateTime::createFromFormat('d/m/Y', $fechaFin)->modify('+1 day')->setTime(0, 0, 0);


            $command->andWhere("na.creation_date between '" . $date_first->format('Y-m-d H:i:s') . "' and '" . $date_last->format('Y-m-d H:') . '59:59' . "'");
        }
        $command->group('nfv.content');
        $consulta1 = $command->queryAll();
        
        $datos = array();
        if (!empty($consulta1)) {
//            var_dump($consulta1);

            $field = $consulta1['0']["label"];
            $fieldType = $consulta1['0']["field_type"];
            $totalFrecuenciaRespuestas = count($consulta1);



            switch ($fieldType) {
                case '1' :
//                    Campo de texto nomal
                    $datos = array_merge($datos, array('label' => $field));

                    //coloca en un array los valores que se repite cada label
                    $frecuancias = array();
                    foreach ($consulta1 as $value) {
                        $frecuancias = array_merge($frecuancias, array($value["fecuencia_fvalue"]));
                    }

                    //coloca calve valor segun su label y su porcentaje
                    $contens = array();
                    foreach ($consulta1 as $value) {
                        $contens = array_merge($contens, array($value ["content"] => self::calcularPocentajeX($frecuancias, $value["fecuencia_fvalue"]) . "%"));
                    }

                    $datos = array_merge($datos, $contens);
                    break;
                case '2' :
//                    Opcion Simple
                    $datos = array_merge($datos, array('label' => $field));

                    //coloca en un array los valores que se repite cada label
                    $frecuancias = array();
                    foreach ($consulta1 as $value) {
                        $frecuancias = array_merge($frecuancias, array($value["fecuencia_fvalue"]));
                    }

                    $contens = array();
                    foreach ($consulta1 as $value) {
                        //consulta la opcion segun el content del field_value
                        $opcion = Yii::app()->db->createCommand()
                                        ->select('label')->from('nosey_option')
                                        ->where('id=:id', array(':id' => $value ["content"]))->queryAll();
                        $contens = array_merge($contens, array($opcion[0]["label"] => self::calcularPocentajeX($frecuancias, $value["fecuencia_fvalue"]) . "%"));
                    }

                    $datos = array_merge($datos, $contens);
                    break;
                case '3' :
//                    Opcion Multiple
                    $datos = array_merge($datos, array('label' => $field));
                    //consulta para extraer todos los respuestas  de un a pregunta sin agupar
                    $command1 = Yii::app()->db->createCommand();
                    $command1->select(" nf.label, nf.field_type,  nfv.content, na.creation_date");
                    $command1->from("nosey_field_value nfv");
                    $command1->leftJoin('nosey_field nf', 'nf.id=nfv.field_id');
                    $command1->leftJoin('nosey_answer na', 'na.id=nfv.answer_id');
                    $command1->where("nfv.field_id= :idFieldValue", array(':idFieldValue' => $idFieldValue));
                    //Si hat rango de fechas
                    if (!empty($fechaFin) && !empty($fechaInicio)) {
                        $date_first = DateTime::createFromFormat('d/m/Y', $fechaInicio)->setTime(0, 0, 0);
                        $date_last = DateTime::createFromFormat('d/m/Y', $fechaFin)->modify('+1 day')->setTime(0, 0, 0);
                        $command1->andWhere("na.creation_date between '" . $date_first->format('Y-m-d H:i:s') . "' and '" . $date_last->format('Y-m-d H:') . '59:59' . "'");
                    }
                    $contenidosOpMulti = $command1->queryAll();

                    $contenidos = array();
                    //toma todos los content de cada registro de la cosulta y almacena en el array $contenidos
                    foreach ($contenidosOpMulti as $con) {
                        $contenidos = array_merge($contenidos, json_decode($con ["content"]));
                    }
                    //cuenta las veces se repite un valor
                    $countUnicosOp = array_count_values($contenidos);
                    //saca valores unicos de el array $contenido
                    $keyUnicos = array_unique($contenidos);

                    $valuesUnicos = array();
                    //apila valores de las veces que repite un elemento en el array $countUnicosOp
                    foreach ($countUnicosOp as $value) {
                        $valuesUnicos = array_merge($valuesUnicos, array($value));
                    }
                    $contens = array();
                    //obtiene los labes de cada opcion segun su valor
                    foreach ($keyUnicos as $value) {
                        $opcion = Yii::app()->db->createCommand()
                                        ->select('label')->from('nosey_option')
                                        ->where('id=:id', array(':id' => $value))->queryAll();
//                    var_dump($opcion[0]["label"]);
                        $contens = array_merge($contens, array($opcion[0]["label"]));
                    }

                    //coloca en un array los valores que se repite cada label
                    $porcentajeValuesUnicos = array();
                    foreach ($valuesUnicos as $value) {

                        $porcentajeValuesUnicos = array_merge($porcentajeValuesUnicos, array(self::calcularPocentajeX($valuesUnicos, $value) . '%'));
                    }

                    //combina el array de $keyUnicos y $valuesUnicos para formar clave valor
                    $datos = array_merge($datos, array_combine($contens, $porcentajeValuesUnicos));
                    break;
                case '4' :
//                Campo de tipo boleano
                    $datos = array_merge($datos, array('label' => $field));

                    //coloca calve valor segun su label y su porcentaje
                    $frecuancias = array();
                    foreach ($consulta1 as $value) {
                        $frecuancias = array_merge($frecuancias, array($value["fecuencia_fvalue"]));
                    }

                    $contens = array();
                    foreach ($consulta1 as $value) {
                        $contens = array_merge($contens, array($value ["content"] == 1 ? "true" : "false" => self::calcularPocentajeX($frecuancias, $value["fecuencia_fvalue"]) . "%"));
                    }
                    $datos = array_merge($datos, $contens);
                    break;
                case '5' :
//                    Campo de tipo Fecha
                    $datos = array_merge($datos, array('label' => $field));

                    $frecuancias = array();
                    foreach ($consulta1 as $value) {
                        $frecuancias = array_merge($frecuancias, array($value["fecuencia_fvalue"]));
                    }

                    $contens = array();
                    foreach ($consulta1 as $value) {
                        $contens = array_merge($contens, array($value ["content"] => self::calcularPocentajeX($frecuancias, $value["fecuencia_fvalue"]) . "%"));
                    }
                    $datos = array_merge($datos, $contens);
                    break;
                case '6' :
//                    Campo de tipo Raiting

                    $datos = array_merge($datos, array('label' => $field));

                    $frecuancias = array();
                    foreach ($consulta1 as $value) {
                        $frecuancias = array_merge($frecuancias, array($value["fecuencia_fvalue"]));
                    }

                    $contens = array();
                    foreach ($consulta1 as $value) {

                        $contens = array_merge($contens, array("0" . $value ["content"] => self::calcularPocentajeX($frecuancias, $value["fecuencia_fvalue"]) . "%"));
                    }
                    $datos = array_merge($datos, $contens);
                    break;
            }

//           @TODO BORRAR
//            var_dump($datos);
        }


        return $datos;
    }

    /**
     * @author JonatanQuilca <jquilca@tradesystem.com.ec>
     * @param array $arregloTotal : arreglo con todos los valores 100%
     * @param strign $valor : valor individual que es elemnto de $arregloTotal 
     */
    public static function calcularPocentajeX($arregloTotal, $valor) {
        $total = 0;
        foreach ($arregloTotal as $value) {
            $total+=$value;
        }
        return number_format(($valor * 100) / $total, 2);
    }

}
